#ifndef MAINLOADER_H
#define MAINLOADER_H
#include <vector>
#include <iostream>
#include <fstream>
#include <ctime>
#include "enemy.h"
#include "tower.h"
#include "map.h"
using namespace std;

class MainLoader{
public:
	MainLoader();
	~MainLoader();
	MainLoader(const MainLoader&);

	void ParseEnemy(string);
	void ParseTower(string);
	void PrintListEnemy();
	void PrintInQueueEnemy();
	void PrintInGameEnemy();
	void PrintListTower();	
	void PrintInGameTower();

	Tower GetTowerFromList(string);
	Tower GetUpgradedTower(string);//string = tower asal, harus yang ada upgradenya kalo nggak error
	Enemy GetEnemyFromList(string);

	void PlantTower(Tower,int,int);
	void RemoveTower(Tower);
	void UpgradeTower(Tower);
	
	void AddQueueingEnemy(Enemy);//Add Enemy ke queue
	void DeployEnemy();//Deploy single enemy dari queuelist ke ingamelist
	
	Tower EditTowerInGame(int,int);
	int GetMaxCostEnemy();//Dapet enemy dengan cost max dr listenemy
	int GetMaxCostTower();//Dapet tower dengan cost max dr listtower
	int GetMinCostEnemy();//Dapet enemy dengan cost min
	int GetMinCostTower();//Dapet tower dengan cost min
	int GetMaxBelowCostEnemy(int);//Dapet enemy dengan cost max di bawah int(misal : nyari cost max di bawah 200)
	int GetMaxBelowCostTower(int);//Dapet tower dengan cost max di bawah int
	int GetMinAboveCostEnemy(int);//Dapet enemy dengan cost min di atas int
	int GetMinAboveCostTower(int);//Dapet tower dengan cost min di atas int
	vector<Enemy> GetInGameEnemy(int);//Dapet list ingame enemy
	vector<Enemy> ListEnemyByCost(int);//List enemy dengan cost tertentu (misalnya : enemy yang costnya 200)
	vector<Tower> ListTowerByCost(int);//List tower dengan cost tertentu
	vector<Tower> ListBaseTower();//List tower yang merupakan base
	bool IsSpaceOccupied(int,int);//Mencari apakah suatu grid dalam map bisa ditanam atau tidak
	pair<int,int>GetTowerBestPlaceAvail();//cari tempat terbaik yang belom ditanami tower
	pair<int,int>GetTowerBestPlace();
	/*STILL TO BE MADE*/
	int GetBestEnemyType();//Mendapatkan tipe enemy terbaik berdasarkan kondisi tower yang tersedia 
	int GetBestTowerType();//Mendapatkan tipe tower terbaik berdasarkan kondisi queueing enemy
	
	vector<Enemy> CreateWaveByMaxCost(int);//THE MAIN GREEDY YAYYY
	vector<Enemy> CreateWaveByMinCost(int);//THE SECOND GREEDY METHOD FOR ENEMY

	void GreedyTowerByCost(int);
	
	/*Still to be made ends here*/
private:
	MAP MainMap;
	vector<Tower> ListTower;
	vector<Tower> InGameTower;
	vector<Enemy> ListEnemy;
	vector<Enemy> InQueueEnemy;
	vector<Enemy> InGameEnemy;
};

#endif